{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Marly Integration with Autogen\n",
    "This notebook example shows how Marly can be used together with Autogen to perform tasks. In the below example workflow, two Agents: pdf_processor and code_executor convert table data from a 10k pdf report into a line chart. Users only need to instruct the agents what table schemas need to be extracted from which pdf file. \n",
    "\n",
    "The pdf_generator is using Marly as a tool to perform high quality data extraction based on pdf document and schema."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Install Dependencies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%capture --no-stderr\n",
    "%pip install \"pyautogen>=0.2.3\" pandas matplotlib PyPDF2\n",
    "%pip install marly\n",
    "%pip install groq"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define Tools"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Function calls using Marly for extracting schema data from pdf\n",
    "import marly\n",
    "from marly import Marly\n",
    "import logging\n",
    "import base64\n",
    "import zlib\n",
    "import os\n",
    "import json\n",
    "from dotenv import load_dotenv\n",
    "import time\n",
    "load_dotenv()\n",
    "\n",
    "client = Marly(\n",
    "    base_url=\"http://localhost:8100\",\n",
    ")\n",
    "\n",
    "PDF_FILE_PATH = \"./lacers_reduced.pdf\"\n",
    "\n",
    "# Define schema for Marly, table column name and a breif description of the column\n",
    "SCHEMA = json.dumps({\n",
    "        \"Firm\": \"The name of the firm\",\n",
    "        \"Number of Funds\": \"The number of funds managed by the firm\",\n",
    "        \"Commitment\": \"The commitment amount in millions of dollars\",\n",
    "        \"Percent of Total Comm\": \"The percentage of total commitment\",\n",
    "        \"Exposure (FMV + Unfunded)\": \"The exposure including fair market value and unfunded commitments in millions of dollars\",\n",
    "        \"Percent of Total Exposure\": \"The percentage of total exposure\",\n",
    "        \"TVPI\": \"Total Value to Paid-In multiple\",\n",
    "        \"Net IRR\": \"Net Internal Rate of Return as a percentage\"\n",
    "    })\n",
    "\n",
    "def read_and_encode_pdf(file_path):\n",
    "    with open(file_path, \"rb\") as file:\n",
    "        pdf_content = base64.b64encode(zlib.compress(file.read())).decode('utf-8')\n",
    "    logging.debug(f\"{file_path} read and encoded\")\n",
    "    return pdf_content\n",
    "\n",
    "def to_dict(results):\n",
    "    return {\"results\": [result.to_dict() for result in results]}\n",
    "\n",
    "def process_pdf_tool(pdf_file_path: str, schema: str) -> list[dict]:\n",
    "    \"\"\"Use this to process the pdf file. \"\"\"\n",
    "    pipeline_response_model = None\n",
    "    try:\n",
    "        pipeline_response_model = client.pipelines.create(\n",
    "            api_key=os.environ.get(\"GROQ_API_KEY\"),\n",
    "            provider_model_name=\"llama-3.1-70b-versatile\",\n",
    "            provider_type=\"groq\",\n",
    "            workloads=[\n",
    "                {\n",
    "                    \"pdf_stream\": read_and_encode_pdf(pdf_file_path),\n",
    "                    \"schemas\": [schema]\n",
    "                }\n",
    "            ]\n",
    "        )\n",
    "    except marly.APIConnectionError as e:\n",
    "        print(\"The server could not be reached\")\n",
    "        print(e.__cause__)\n",
    "    except marly.RateLimitError as e:\n",
    "        print(\"A 429 status code was received; we should back off a bit.\")\n",
    "    except marly.APIStatusError as e:\n",
    "        print(\"Another non-200-range status code was received\")\n",
    "        print(e.status_code)\n",
    "        print(e.response)\n",
    "\n",
    "    max_attempts = 100\n",
    "    attempt = 0\n",
    "    while attempt < max_attempts:\n",
    "        logging.debug(f\"Waiting for pipeline to complete. Attempt {attempt + 1} of {max_attempts}\")\n",
    "        time.sleep(1)\n",
    "\n",
    "        results = client.pipelines.retrieve(pipeline_response_model.task_id)\n",
    "        logging.debug(f\"Poll attempt {attempt + 1}: Status - {results.status}\")\n",
    "\n",
    "        if results.status == 'COMPLETED':\n",
    "            logging.debug(f\"Pipeline completed with results: {results.results}\")\n",
    "            return to_dict(results.results)\n",
    "        elif results.status == 'FAILED':\n",
    "            logging.error(f\"Error: {results.get('error_message', 'Unknown error')}\")\n",
    "            return None\n",
    "\n",
    "        attempt += 1\n",
    "\n",
    "    logging.warning(\"Timeout: Pipeline execution took too long.\")\n",
    "    return None\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Here we're using langchain PythonREPL tool to execute any arbitrary Python code, if you dont have Langchain library installed, uncomment below line to install\n",
    "# %pip install langchain, langchain_experimental\n",
    "\n",
    "# Function to execute any Python function. Note: USE WITH CAUTION\n",
    "from langchain_experimental.utilities import PythonREPL\n",
    "repl = PythonREPL()\n",
    "\n",
    "# Define the tool to execute python code\n",
    "def python_repl(\n",
    "    code: str,\n",
    "):\n",
    "    \"\"\"Use this to execute python code. \"\"\"\n",
    "    try:\n",
    "        print(f\"code to execute: {code}\")\n",
    "        result = repl.run(code)\n",
    "    except BaseException as e:\n",
    "        return f\"Failed to execute. Error: {repr(e)}\"\n",
    "    result_str = f\"Successfully executed:\\n```python\\n{code}\\n```\\nStdout: {result}\"\n",
    "    return (\n",
    "        result_str + \"\\n\\nIf you have completed all tasks, respond with FINAL ANSWER.\"\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define Agents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import autogen\n",
    "from autogen.coding import LocalCommandLineCodeExecutor\n",
    "\n",
    "config_list = autogen.config_list_from_json(\n",
    "    \"OAI_CONFIG_LIST.json\",\n",
    ")\n",
    "\n",
    "llm_config = {\n",
    "    \"config_list\": config_list,\n",
    "    \"timeout\": 120,\n",
    "}\n",
    "\n",
    "# Agent that can call process_pdf_tool function to process pdf\n",
    "pdf_processor = autogen.AssistantAgent(\n",
    "    name=\"pdf_processor\",\n",
    "    llm_config=llm_config,\n",
    "    system_message='''You are an expert at extracting data for a schema from PDFs.\n",
    "     For pdf processing tasks, only use the functions you have been provided with.\n",
    "     Reply TERMINATE when the task is done and there's no problem''',\n",
    ")\n",
    "\n",
    "# Agent that can call python_repl function to write and execute python code\n",
    "code_executor = autogen.AssistantAgent(\n",
    "    name=\"code_executor\",\n",
    "    llm_config=llm_config,\n",
    "    system_message='''You are an expert at writing python code and execute the code.\n",
    "      For code execution tasks, only use the functions you have been provided with.\n",
    "      Reply TERMINATE when the task is solved and there is no problem.''',\n",
    ")\n",
    "\n",
    "\n",
    "# executor = LocalCommandLineCodeExecutor(work_dir=\"coding\")\n",
    "\n",
    "# create a UserProxyAgent instance named \"user_proxy\"\n",
    "user_proxy = autogen.UserProxyAgent(\n",
    "    name=\"user_proxy\",\n",
    "    is_termination_msg=lambda x: x.get(\"content\", \"\") and x.get(\"content\", \"\").rstrip().endswith(\"TERMINATE\"),\n",
    "    human_input_mode=\"NEVER\",\n",
    "    max_consecutive_auto_reply=100,\n",
    "    # code_execution_config={\n",
    "    #     \"executor\": executor,\n",
    "    # }\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Assign Tools to the Agents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "from typing_extensions import Annotated\n",
    "\n",
    "# Assign process_pdf_tool function call to pdf_processor\n",
    "@user_proxy.register_for_execution()\n",
    "@pdf_processor.register_for_llm(description=\"pdf_processor\")\n",
    "def process_pdf(pdf_file_path: Annotated[str, \"PDF to be processed\"], schema: Annotated[str, \"Schema for the data to be extracted\"]) -> list[dict]:\n",
    "    return process_pdf_tool(pdf_file_path, schema)\n",
    "\n",
    "# Assign python_repl function call to code_executor\n",
    "@user_proxy.register_for_execution()\n",
    "@code_executor.register_for_llm(description=\"code_executor\")\n",
    "def execute_function(code: Annotated[str, \"Python code to be executed\"]) -> str:\n",
    "    python_repl(code)\n",
    "    return \"Done\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Execute the flow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[33muser_proxy\u001b[0m (to pdf_processor):\n",
      "\n",
      "What data can you extract from the pdf under path ./lacers_reduced.pdf with the given schema {\"Firm\": \"The name of the firm\", \"Number of Funds\": \"The number of funds managed by the firm\", \"Commitment\": \"The commitment amount in millions of dollars\", \"Percent of Total Comm\": \"The percentage of total commitment\", \"Exposure (FMV + Unfunded)\": \"The exposure including fair market value and unfunded commitments in millions of dollars\", \"Percent of Total Exposure\": \"The percentage of total exposure\", \"TVPI\": \"Total Value to Paid-In multiple\", \"Net IRR\": \"Net Internal Rate of Return as a percentage\"}\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[33mpdf_processor\u001b[0m (to user_proxy):\n",
      "\n",
      "\u001b[32m***** Suggested tool call (call_9dwy): process_pdf *****\u001b[0m\n",
      "Arguments: \n",
      "{\"pdf_file_path\": \"./lacers_reduced.pdf\", \"schema\": \"{\\\"Firm\\\": \\\"The name of the firm\\\", \\\"Number of Funds\\\": \\\"The number of funds managed by the firm\\\", \\\"Commitment\\\": \\\"The commitment amount in millions of dollars\\\", \\\"Percent of Total Comm\\\": \\\"The percentage of total commitment\\\", \\\"Exposure (FMV + Unfunded)\\\": \\\"The exposure including fair market value and unfunded commitments in millions of dollars\\\", \\\"Percent of Total Exposure\\\": \\\"The percentage of total exposure\\\", \\\"TVPI\\\": \\\"Total Value to Paid-In multiple\\\", \\\"Net IRR\\\": \\\"Net Internal Rate of Return as a percentage\\\"}\"}\n",
      "\u001b[32m********************************************************\u001b[0m\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[35m\n",
      ">>>>>>>> EXECUTING FUNCTION process_pdf...\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/homebrew/lib/python3.12/site-packages/autogen/oai/groq.py:286: UserWarning: Cost calculation not available for model llama-3.1-70b-versatile\n",
      "  warnings.warn(f\"Cost calculation not available for model {model}\", UserWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[33muser_proxy\u001b[0m (to pdf_processor):\n",
      "\n",
      "\u001b[33muser_proxy\u001b[0m (to pdf_processor):\n",
      "\n",
      "\u001b[32m***** Response from calling tool (call_9dwy) *****\u001b[0m\n",
      "{\"results\": [{\"metrics\": {\"schema_0\": \"{\\n   \\\"Firm\\\": [\\n      \\\"Vista Equity Partners\\\",\\n      \\\"ABRY Partners\\\",\\n      \\\"Advent International\\\",\\n      \\\"Thoma Bravo\\\",\\n      \\\"Platinum Equity\\\",\\n      \\\"Spark Management Partners\\\",\\n      \\\"New Enterprise Associates\\\",\\n      \\\"Technology Crossover Ventures\\\",\\n      \\\"EnCap Investments\\\",\\n      \\\"Hellman & Friedman\\\"\\n   ],\\n   \\\"Number of Funds\\\": [\\n      \\\"7\\\",\\n      \\\"6\\\",\\n      \\\"5\\\",\\n      \\\"5\\\",\\n      \\\"4\\\",\\n      \\\"6\\\",\\n      \\\"4\\\",\\n      \\\"5\\\",\\n      \\\"4\\\",\\n      \\\"5\\\"\\n   ],\\n   \\\"Commitment\\\": [\\n      \\\"185,000,000\\\",\\n      \\\"145,000,000\\\",\\n      \\\"145,000,000\\\",\\n      \\\"90,000,000\\\",\\n      \\\"112,500,000\\\",\\n      \\\"93,750,000\\\",\\n      \\\"95,000,000\\\",\\n      \\\"104,500,000\\\",\\n      \\\"120,000,000\\\",\\n      \\\"100,463,972\\\"\\n   ],\\n   \\\"Percent of Total Comm\\\": [\\n      \\\"3.6\\\",\\n      \\\"2.8\\\",\\n      \\\"2.8\\\",\\n      \\\"1.8\\\",\\n      \\\"2.2\\\",\\n      \\\"1.8\\\",\\n      \\\"1.9\\\",\\n      \\\"2.0\\\",\\n      \\\"2.3\\\",\\n      \\\"2.0\\\"\\n   ],\\n   \\\"Exposure (FMV + Unfunded)\\\": [\\n      \\\"192,356,158\\\",\\n      \\\"146,947,169\\\",\\n      \\\"132,320,692\\\",\\n      \\\"119,164,173\\\",\\n      \\\"105,732,861\\\",\\n      \\\"104,048,457\\\",\\n      \\\"103,565,654\\\",\\n      \\\"100,481,558\\\",\\n      \\\"97,535,330\\\",\\n      \\\"91,816,195\\\"\\n   ],\\n   \\\"Percent of Total Exposure\\\": [\\n      \\\"5.4\\\",\\n      \\\"4.2\\\",\\n      \\\"3.7\\\",\\n      \\\"3.4\\\",\\n      \\\"3.0\\\",\\n      \\\"2.9\\\",\\n      \\\"2.9\\\",\\n      \\\"2.8\\\",\\n      \\\"2.8\\\",\\n      \\\"2.6\\\"\\n   ],\\n   \\\"TVPI\\\": [\\n      \\\"2.07\\\",\\n      \\\"1.25\\\",\\n      \\\"1.64\\\",\\n      \\\"1.85\\\",\\n      \\\"1.64\\\",\\n      \\\"2.42\\\",\\n      \\\"1.60\\\",\\n      \\\"1.95\\\",\\n      \\\"1.11\\\",\\n      \\\"2.09\\\"\\n   ],\\n   \\\"Net IRR\\\": [\\n      \\\"22.2\\\",\\n      \\\"9.6\\\",\\n      \\\"16.0\\\",\\n      \\\"24.7\\\",\\n      \\\"28.5\\\",\\n      \\\"27.4\\\",\\n      \\\"15.7\\\",\\n      \\\"14.9\\\",\\n      \\\"4.5\\\",\\n      \\\"20.3\\\"\\n   ]\\n}\"}, \"schema_data\": {\"Firm\": \"The name of the firm\", \"Number of Funds\": \"The number of funds managed by the firm\", \"Commitment\": \"The commitment amount in millions of dollars\", \"Percent of Total Comm\": \"The percentage of total commitment\", \"Exposure (FMV + Unfunded)\": \"The exposure including fair market value and unfunded commitments in millions of dollars\", \"Percent of Total Exposure\": \"The percentage of total exposure\", \"TVPI\": \"Total Value to Paid-In multiple\", \"Net IRR\": \"Net Internal Rate of Return as a percentage\"}, \"schema_id\": \"schema_0\"}]}\n",
      "\u001b[32m**************************************************\u001b[0m\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[33mpdf_processor\u001b[0m (to user_proxy):\n",
      "\n",
      "TERMINATE\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[33muser_proxy\u001b[0m (to code_executor):\n",
      "\n",
      "Write Python code to plot a chart of the firm and their commitments based on {\"results\": [{\"metrics\": {\"schema_0\": \"{\\n   \\\"Firm\\\": [\\n      \\\"Vista Equity Partners\\\",\\n      \\\"ABRY Partners\\\",\\n      \\\"Advent International\\\",\\n      \\\"Thoma Bravo\\\",\\n      \\\"Platinum Equity\\\",\\n      \\\"Spark Management Partners\\\",\\n      \\\"New Enterprise Associates\\\",\\n      \\\"Technology Crossover Ventures\\\",\\n      \\\"EnCap Investments\\\",\\n      \\\"Hellman & Friedman\\\"\\n   ],\\n   \\\"Number of Funds\\\": [\\n      \\\"7\\\",\\n      \\\"6\\\",\\n      \\\"5\\\",\\n      \\\"5\\\",\\n      \\\"4\\\",\\n      \\\"6\\\",\\n      \\\"4\\\",\\n      \\\"5\\\",\\n      \\\"4\\\",\\n      \\\"5\\\"\\n   ],\\n   \\\"Commitment\\\": [\\n      \\\"185,000,000\\\",\\n      \\\"145,000,000\\\",\\n      \\\"145,000,000\\\",\\n      \\\"90,000,000\\\",\\n      \\\"112,500,000\\\",\\n      \\\"93,750,000\\\",\\n      \\\"95,000,000\\\",\\n      \\\"104,500,000\\\",\\n      \\\"120,000,000\\\",\\n      \\\"100,463,972\\\"\\n   ],\\n   \\\"Percent of Total Comm\\\": [\\n      \\\"3.6\\\",\\n      \\\"2.8\\\",\\n      \\\"2.8\\\",\\n      \\\"1.8\\\",\\n      \\\"2.2\\\",\\n      \\\"1.8\\\",\\n      \\\"1.9\\\",\\n      \\\"2.0\\\",\\n      \\\"2.3\\\",\\n      \\\"2.0\\\"\\n   ],\\n   \\\"Exposure (FMV + Unfunded)\\\": [\\n      \\\"192,356,158\\\",\\n      \\\"146,947,169\\\",\\n      \\\"132,320,692\\\",\\n      \\\"119,164,173\\\",\\n      \\\"105,732,861\\\",\\n      \\\"104,048,457\\\",\\n      \\\"103,565,654\\\",\\n      \\\"100,481,558\\\",\\n      \\\"97,535,330\\\",\\n      \\\"91,816,195\\\"\\n   ],\\n   \\\"Percent of Total Exposure\\\": [\\n      \\\"5.4\\\",\\n      \\\"4.2\\\",\\n      \\\"3.7\\\",\\n      \\\"3.4\\\",\\n      \\\"3.0\\\",\\n      \\\"2.9\\\",\\n      \\\"2.9\\\",\\n      \\\"2.8\\\",\\n      \\\"2.8\\\",\\n      \\\"2.6\\\"\\n   ],\\n   \\\"TVPI\\\": [\\n      \\\"2.07\\\",\\n      \\\"1.25\\\",\\n      \\\"1.64\\\",\\n      \\\"1.85\\\",\\n      \\\"1.64\\\",\\n      \\\"2.42\\\",\\n      \\\"1.60\\\",\\n      \\\"1.95\\\",\\n      \\\"1.11\\\",\\n      \\\"2.09\\\"\\n   ],\\n   \\\"Net IRR\\\": [\\n      \\\"22.2\\\",\\n      \\\"9.6\\\",\\n      \\\"16.0\\\",\\n      \\\"24.7\\\",\\n      \\\"28.5\\\",\\n      \\\"27.4\\\",\\n      \\\"15.7\\\",\\n      \\\"14.9\\\",\\n      \\\"4.5\\\",\\n      \\\"20.3\\\"\\n   ]\\n}\"}, \"schema_data\": {\"Firm\": \"The name of the firm\", \"Number of Funds\": \"The number of funds managed by the firm\", \"Commitment\": \"The commitment amount in millions of dollars\", \"Percent of Total Comm\": \"The percentage of total commitment\", \"Exposure (FMV + Unfunded)\": \"The exposure including fair market value and unfunded commitments in millions of dollars\", \"Percent of Total Exposure\": \"The percentage of total exposure\", \"TVPI\": \"Total Value to Paid-In multiple\", \"Net IRR\": \"Net Internal Rate of Return as a percentage\"}, \"schema_id\": \"schema_0\"}]}.\n",
      "            Save the chart to plot.png\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[33mcode_executor\u001b[0m (to user_proxy):\n",
      "\n",
      "\u001b[32m***** Suggested tool call (call_tpy5): execute_function *****\u001b[0m\n",
      "Arguments: \n",
      "{\"code\":\"import pandas as pd\\nimport matplotlib.pyplot as plt\\n\\n# Define the data\\nfirms = ['Vista Equity Partners', 'ABRY Partners', 'Advent International', 'Thoma Bravo', 'Platinum Equity', 'Spark Management Partners', 'New Enterprise Associates', 'Technology Crossover Ventures', 'EnCap Investments', 'Hellman & Friedman']\\ncommitments = [185000000, 145000000, 145000000, 90000000, 112500000, 93750000, 95000000, 104500000, 120000000, 100463972]\\n\\n# Create a pandas DataFrame\\nchart_data = pd.DataFrame({\\n    'Firm': firms,\\n    'Commitment': commitments\\n})\\n\\n# Plot the chart\\nplt.figure(figsize=(10, 5))\\nplt.bar('Firm', 'Commitment', data=chart_data)\\nplt.xlabel('Firm Name')\\nplt.ylabel('Commitment ($ millions)')\\nplt.title('Commitments by Firm')\\nplt.xticks(rotation=90)\\nplt.tight_layout()\\n\\n# Save the plot to an image file\\nplt.savefig('plot.png')\\nprint('Plot saved to plot.png')\\n\"}\n",
      "\u001b[32m*************************************************************\u001b[0m\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[35m\n",
      ">>>>>>>> EXECUTING FUNCTION execute_function...\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:langchain_experimental.utilities.python:Python REPL can execute arbitrary code. Use with caution.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "code to execute: import pandas as pd\n",
      "import matplotlib.pyplot as plt\n",
      "\n",
      "# Define the data\n",
      "firms = ['Vista Equity Partners', 'ABRY Partners', 'Advent International', 'Thoma Bravo', 'Platinum Equity', 'Spark Management Partners', 'New Enterprise Associates', 'Technology Crossover Ventures', 'EnCap Investments', 'Hellman & Friedman']\n",
      "commitments = [185000000, 145000000, 145000000, 90000000, 112500000, 93750000, 95000000, 104500000, 120000000, 100463972]\n",
      "\n",
      "# Create a pandas DataFrame\n",
      "chart_data = pd.DataFrame({\n",
      "    'Firm': firms,\n",
      "    'Commitment': commitments\n",
      "})\n",
      "\n",
      "# Plot the chart\n",
      "plt.figure(figsize=(10, 5))\n",
      "plt.bar('Firm', 'Commitment', data=chart_data)\n",
      "plt.xlabel('Firm Name')\n",
      "plt.ylabel('Commitment ($ millions)')\n",
      "plt.title('Commitments by Firm')\n",
      "plt.xticks(rotation=90)\n",
      "plt.tight_layout()\n",
      "\n",
      "# Save the plot to an image file\n",
      "plt.savefig('plot.png')\n",
      "print('Plot saved to plot.png')\n",
      "\n",
      "\u001b[33muser_proxy\u001b[0m (to code_executor):\n",
      "\n",
      "\u001b[33muser_proxy\u001b[0m (to code_executor):\n",
      "\n",
      "\u001b[32m***** Response from calling tool (call_tpy5) *****\u001b[0m\n",
      "Done\n",
      "\u001b[32m**************************************************\u001b[0m\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[33mcode_executor\u001b[0m (to user_proxy):\n",
      "\n",
      "TERMINATE\n",
      "\n",
      "--------------------------------------------------------------------------------\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/homebrew/lib/python3.12/site-packages/autogen/oai/groq.py:286: UserWarning: Cost calculation not available for model llama-3.1-70b-versatile\n",
      "  warnings.warn(f\"Cost calculation not available for model {model}\", UserWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "ChatResult(chat_id=None, chat_history=[{'content': 'Write Python code to plot a chart of the firm and their commitments based on {\"results\": [{\"metrics\": {\"schema_0\": \"{\\\\n   \\\\\"Firm\\\\\": [\\\\n      \\\\\"Vista Equity Partners\\\\\",\\\\n      \\\\\"ABRY Partners\\\\\",\\\\n      \\\\\"Advent International\\\\\",\\\\n      \\\\\"Thoma Bravo\\\\\",\\\\n      \\\\\"Platinum Equity\\\\\",\\\\n      \\\\\"Spark Management Partners\\\\\",\\\\n      \\\\\"New Enterprise Associates\\\\\",\\\\n      \\\\\"Technology Crossover Ventures\\\\\",\\\\n      \\\\\"EnCap Investments\\\\\",\\\\n      \\\\\"Hellman & Friedman\\\\\"\\\\n   ],\\\\n   \\\\\"Number of Funds\\\\\": [\\\\n      \\\\\"7\\\\\",\\\\n      \\\\\"6\\\\\",\\\\n      \\\\\"5\\\\\",\\\\n      \\\\\"5\\\\\",\\\\n      \\\\\"4\\\\\",\\\\n      \\\\\"6\\\\\",\\\\n      \\\\\"4\\\\\",\\\\n      \\\\\"5\\\\\",\\\\n      \\\\\"4\\\\\",\\\\n      \\\\\"5\\\\\"\\\\n   ],\\\\n   \\\\\"Commitment\\\\\": [\\\\n      \\\\\"185,000,000\\\\\",\\\\n      \\\\\"145,000,000\\\\\",\\\\n      \\\\\"145,000,000\\\\\",\\\\n      \\\\\"90,000,000\\\\\",\\\\n      \\\\\"112,500,000\\\\\",\\\\n      \\\\\"93,750,000\\\\\",\\\\n      \\\\\"95,000,000\\\\\",\\\\n      \\\\\"104,500,000\\\\\",\\\\n      \\\\\"120,000,000\\\\\",\\\\n      \\\\\"100,463,972\\\\\"\\\\n   ],\\\\n   \\\\\"Percent of Total Comm\\\\\": [\\\\n      \\\\\"3.6\\\\\",\\\\n      \\\\\"2.8\\\\\",\\\\n      \\\\\"2.8\\\\\",\\\\n      \\\\\"1.8\\\\\",\\\\n      \\\\\"2.2\\\\\",\\\\n      \\\\\"1.8\\\\\",\\\\n      \\\\\"1.9\\\\\",\\\\n      \\\\\"2.0\\\\\",\\\\n      \\\\\"2.3\\\\\",\\\\n      \\\\\"2.0\\\\\"\\\\n   ],\\\\n   \\\\\"Exposure (FMV + Unfunded)\\\\\": [\\\\n      \\\\\"192,356,158\\\\\",\\\\n      \\\\\"146,947,169\\\\\",\\\\n      \\\\\"132,320,692\\\\\",\\\\n      \\\\\"119,164,173\\\\\",\\\\n      \\\\\"105,732,861\\\\\",\\\\n      \\\\\"104,048,457\\\\\",\\\\n      \\\\\"103,565,654\\\\\",\\\\n      \\\\\"100,481,558\\\\\",\\\\n      \\\\\"97,535,330\\\\\",\\\\n      \\\\\"91,816,195\\\\\"\\\\n   ],\\\\n   \\\\\"Percent of Total Exposure\\\\\": [\\\\n      \\\\\"5.4\\\\\",\\\\n      \\\\\"4.2\\\\\",\\\\n      \\\\\"3.7\\\\\",\\\\n      \\\\\"3.4\\\\\",\\\\n      \\\\\"3.0\\\\\",\\\\n      \\\\\"2.9\\\\\",\\\\n      \\\\\"2.9\\\\\",\\\\n      \\\\\"2.8\\\\\",\\\\n      \\\\\"2.8\\\\\",\\\\n      \\\\\"2.6\\\\\"\\\\n   ],\\\\n   \\\\\"TVPI\\\\\": [\\\\n      \\\\\"2.07\\\\\",\\\\n      \\\\\"1.25\\\\\",\\\\n      \\\\\"1.64\\\\\",\\\\n      \\\\\"1.85\\\\\",\\\\n      \\\\\"1.64\\\\\",\\\\n      \\\\\"2.42\\\\\",\\\\n      \\\\\"1.60\\\\\",\\\\n      \\\\\"1.95\\\\\",\\\\n      \\\\\"1.11\\\\\",\\\\n      \\\\\"2.09\\\\\"\\\\n   ],\\\\n   \\\\\"Net IRR\\\\\": [\\\\n      \\\\\"22.2\\\\\",\\\\n      \\\\\"9.6\\\\\",\\\\n      \\\\\"16.0\\\\\",\\\\n      \\\\\"24.7\\\\\",\\\\n      \\\\\"28.5\\\\\",\\\\n      \\\\\"27.4\\\\\",\\\\n      \\\\\"15.7\\\\\",\\\\n      \\\\\"14.9\\\\\",\\\\n      \\\\\"4.5\\\\\",\\\\n      \\\\\"20.3\\\\\"\\\\n   ]\\\\n}\"}, \"schema_data\": {\"Firm\": \"The name of the firm\", \"Number of Funds\": \"The number of funds managed by the firm\", \"Commitment\": \"The commitment amount in millions of dollars\", \"Percent of Total Comm\": \"The percentage of total commitment\", \"Exposure (FMV + Unfunded)\": \"The exposure including fair market value and unfunded commitments in millions of dollars\", \"Percent of Total Exposure\": \"The percentage of total exposure\", \"TVPI\": \"Total Value to Paid-In multiple\", \"Net IRR\": \"Net Internal Rate of Return as a percentage\"}, \"schema_id\": \"schema_0\"}]}.\\n            Save the chart to plot.png', 'role': 'assistant', 'name': 'user_proxy'}, {'tool_calls': [{'id': 'call_tpy5', 'function': {'arguments': '{\"code\":\"import pandas as pd\\\\nimport matplotlib.pyplot as plt\\\\n\\\\n# Define the data\\\\nfirms = [\\'Vista Equity Partners\\', \\'ABRY Partners\\', \\'Advent International\\', \\'Thoma Bravo\\', \\'Platinum Equity\\', \\'Spark Management Partners\\', \\'New Enterprise Associates\\', \\'Technology Crossover Ventures\\', \\'EnCap Investments\\', \\'Hellman & Friedman\\']\\\\ncommitments = [185000000, 145000000, 145000000, 90000000, 112500000, 93750000, 95000000, 104500000, 120000000, 100463972]\\\\n\\\\n# Create a pandas DataFrame\\\\nchart_data = pd.DataFrame({\\\\n    \\'Firm\\': firms,\\\\n    \\'Commitment\\': commitments\\\\n})\\\\n\\\\n# Plot the chart\\\\nplt.figure(figsize=(10, 5))\\\\nplt.bar(\\'Firm\\', \\'Commitment\\', data=chart_data)\\\\nplt.xlabel(\\'Firm Name\\')\\\\nplt.ylabel(\\'Commitment ($ millions)\\')\\\\nplt.title(\\'Commitments by Firm\\')\\\\nplt.xticks(rotation=90)\\\\nplt.tight_layout()\\\\n\\\\n# Save the plot to an image file\\\\nplt.savefig(\\'plot.png\\')\\\\nprint(\\'Plot saved to plot.png\\')\\\\n\"}', 'name': 'execute_function'}, 'type': 'function'}], 'content': None, 'role': 'assistant'}, {'content': 'Done', 'tool_responses': [{'tool_call_id': 'call_tpy5', 'role': 'tool', 'content': 'Done'}], 'role': 'tool', 'name': 'user_proxy'}, {'content': 'TERMINATE', 'role': 'user', 'name': 'code_executor'}], summary={'content': None, 'refusal': None, 'role': 'assistant', 'function_call': None, 'tool_calls': [{'id': 'call_64v9', 'function': {'arguments': '{\"code\":\"import matplotlib.pyplot as plt\\\\nplt.clf()\\\\nplt.cla()\\\\nplt.close()\\\\n\"}', 'name': 'execute_function'}, 'type': 'function'}]}, cost={'usage_including_cached_inference': {'total_cost': 0.0, 'llama-3.1-70b-versatile': {'cost': 0.0, 'prompt_tokens': 3897, 'completion_tokens': 314, 'total_tokens': 4211}}, 'usage_excluding_cached_inference': {'total_cost': 0.0, 'llama-3.1-70b-versatile': {'cost': 0.0, 'prompt_tokens': 3897, 'completion_tokens': 314, 'total_tokens': 4211}}}, human_input=[])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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KzIyEomJiahRowa8vb3h4+ODkJAQxMXF4eLFi5g/fz4OHjwI4F3Tm0uXLmH27Nm4e/cuIiIiMGDAAFhZWcHFxUXEvxkREVHZFBcXhz///BO9evWChoYGhg4dKnYkIiL6yn3VRfXly5fh4uIiL4B9fX3h4uKC6dOnAwDWr18PHx8fjBs3DjVr1oSXlxcuXbqEatWqAQBatmyJLVu2YO/evXBxcUH79u2hpaWF0NDQD+5nSURERMV36tQp9O3bF3FxcdiwYQPMzMzEjkRERF85rqkmIiIiIiIiKqav+ko1ERERERER0edgUU1ERERERERUTF9d9+/8/Hw8evQI+vr63EeaiIiIiIiIChAEAa9evYKFhUWBHZ/+7asrqh89egRLS0uxYxAREREREVEpl5SUhKpVq370MV9dUa2vrw/g3ckxMDAQOQ0RERERERGVNunp6bC0tJTXjx/z1RXV76d8GxgYsKgmIiIiIiKiDyrKkmE2KiMiIiIiIiIqJhbVRERERERERMXEopqIiIiIiIiomFhUExERERERERUTi2oiIiIiIiKiYmJRTURERERERFRMLKqJiIiIiIiIiumr26daSqwnHRQ7QqkRv8BD7AhEREREREQF8Eo1ERERERERUTGxqCYiIiIiIiIqJhbVRERERERERMXEopqIiIiIiIiomFhUExERERERERUTi2oiIiIiIiKiYlJ6S624uDj8/fffSEhIQFZWFipXrgwXFxc0btwY2traJZGRiIiIiIiIqFQqclG9efNmLFmyBJcvX4apqSksLCygo6OD58+fIzY2Ftra2vD29sbEiRNhZWVVkpmJiIiIiIiISoUiFdUuLi7Q1NRE//79sXv3blhaWiocz8nJwblz57Bt2zY0aNAAv/32G7p161YigYmIiIiIiIhKiyIV1QsWLEC7du0+eFxLSwvNmzdH8+bNMW/ePMTHx6sqHxEREREREVGpVaSi+mMF9b9VrFgRFStWLHYgIiIiIiIiIqlQuvt3REQEYmJi5Pf37dsHLy8v/Pzzz8jNzVVpOCIiIiIiIqLSTOmieujQobhz5w4A4P79++jZsyd0dXWxc+dOTJgwQeUBiYiIiIiIiEorpYvqO3fuoF69egCAnTt3olmzZtiyZQuCg4Oxe/duVecjIiIiIiIiKrWULqoFQUB+fj4A4NixY3B3dwcAWFpa4unT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IiIiKiYW1URERERERETFpPSaaiIiIiIiKvusJx0UO0KpEb/AQ+wIVIrxSjURERERERFRMX12UX3z5k2sX78ekZGRKohDREREREREJB1KTf+ePXs2dHR0MH78eADvttdq37499PX18fLlSwQHB8Pb27tEghIRERERERGVNkpdqd61axccHR3l9+fNm4dRo0bh6dOnWL58Ofz9/VUekIiIiIiIiKi0KtKV6o0bN0IQBMTHxyMyMhLPnj2DIAg4e/Ys/vvf/2Ljxo3Iz8/H/fv3sXHjRgCAj49PiQYnIiIiIiIiEluRimorKysAgKamJkxNTWFlZYXIyEgYGBigRYsWEAQBOTk5kMlksLa2hiAIJRqaiIiIiIiIqDQoUlHt5uYGAHB1dcX//vc/TJw4EaGhoXB3d0ezZs0AADExMbC0tJTfJyIiEhO3glHE7WCIiIhKhlJrqn/55RdERkaiadOmSEhIwOzZs+XHgoOD0b59e5UHJCIiIiIiIiqtlOr+XbduXcTHx+PZs2eoWLGiwjE/Pz8YGBioNBwRERERERFRaaZUUf3evwtqADA3N//sMERERERERERSUqTp39u2bSvyF0xKSsLZs2eLHYiIiIiIiIhIKopUVP/+++9wcHDAokWLcPPmzQLHX758ib/++gu9e/eGq6srnj17pvKgRERERERERKVNkaZ/nzp1Cvv378eyZcswefJk6OnpwdTUFNra2njx4gWSk5NRqVIl9O/fH9euXYOpqWlJ5yYiIiIiIiISXZHXVHt6esLT0xNPnz7FmTNnkJCQgNevX6NSpUpwcXGBi4sL1NSUaiZOREREREREJGlKNyqrVKkSvLy8SiAKERERERERkbQUq/u3qpw+fRq//PILrly5gsePH2PPnj2fLNhPnjwJX19fXL9+HZaWlpg6dSr69+//RfISERERUellPemg2BFKjfgFHmJHIPpqiDpfOzMzE3Xr1sWKFSuK9Pi4uDh4eHigRYsWiIyMxJgxYzB48GAcPny4hJMSERERERERFSTqleoOHTqgQ4cORX78ypUrYWNjg8WLFwMAHBwccObMGQQGBqJdu3YlFZOIiIiIiIioUJLqLHbu3Dm0bt1aYaxdu3Y4d+7cB5+Tk5OD9PR0hRsRERERERGRKih9pXr27Nnw8/ODrq6uwvjr16/xyy+/YPr06SoL92/JyckFtusyNTVFeno6Xr9+DR0dnQLPmT9/PmbNmlVimYiIiIiIiD6Fa/4VlaV1/0pfqZ41axYyMjIKjGdlZZXK4nXy5Ml4+fKl/JaUlCR2JCIiIiIiIiojlL5SLQgCZDJZgfGoqChUqFBBJaE+xMzMDCkpKQpjKSkpMDAwKPQqNQBoaWlBS0urRHMRERERERHR16nIRbWxsTFkMhlkMhlq1KihUFjn5eUhIyMDw4YNK5GQ7zVu3Bh//fWXwtjRo0fRuHHjEv2+RERERERERIUpclEdFBQEQRAwcOBAzJo1C4aGhvJjmpqasLa2Vrq4zcjIwL179+T34+LiEBkZiQoVKqBatWqYPHkyHj58iI0bNwIAhg0bhuXLl2PChAkYOHAgjh8/jh07duDgQa5PICIiIiIioi+vyEV1v379AAA2NjZo0qQJNDQ0PvubX758GS1atJDf9/X1lX+v4OBgPH78GImJifLjNjY2OHjwIMaOHYslS5agatWqWLNmDbfTIiIiIslh0yJFZalpERF9XZReU+3m5ob8/HzcuXMHqampyM/PVzjerFmzIn+t5s2bQxCEDx4PDg4u9DlXr14t8vcgIiIiIiIiKilKF9Xnz59H7969kZCQUKAglslkyMvLU1k4IiIiKj14ZfX/8KoqERG9p3RRPWzYMDRo0AAHDx6Eubl5oZ3AiYiIiIiIiL4GShfVd+/exa5du1C9evWSyENEREREREQkGWrKPuHbb79V6NhNRERERERE9LVS+kr1yJEjMW7cOCQnJ8PZ2blAF/A6deqoLBwR0deE61X/D9erEhERkVQoXVR36dIFADBw4ED5mEwmgyAIbFRGREREREREXxWli+q4uLiSyEFEREREREQkOUoX1VZWViWRg4iIiIiIiEhylG5UBgCbNm1C06ZNYWFhgYSEBABAUFAQ9u3bp9JwRERERERERKWZ0kX177//Dl9fX7i7uyMtLU2+htrIyAhBQUGqzkdERERERERUaildVC9btgx//PEHpkyZAnV1dfl4gwYNEBMTo9JwRERERERERKWZ0kV1XFwcXFxcCoxraWkhMzNTJaGIiIiIiIiIpEDpotrGxgaRkZEFxkNDQ+Hg4KCKTERERERERESSoHT3b19fXwwfPhzZ2dkQBAEXL17E1q1bMX/+fKxZs6YkMhIRERERERGVSkoX1YMHD4aOjg6mTp2KrKws9O7dGxYWFliyZAl69uxZEhmJiIiIiIiISiWli2oA8Pb2hre3N7KyspCRkQETExNV5yIiIiIiIiIq9YpVVL+nq6sLXV1dVWUhIiIiIiIikhSli+pnz55h+vTpOHHiBFJTU5Gfn69w/Pnz5yoLR0RERERERFSaKV1U9+3bF/fu3cOgQYNgamoKmUxWErmIiIiIiIiISj2li+q///4bZ86cQd26dUsiDxEREREREZFkKL1Pda1atfD69euSyEJEREREREQkKUoX1b/99humTJmCU6dO4dmzZ0hPT1e4EREREREREX0tlJ7+bWRkhPT0dLRs2VJhXBAEyGQy5OXlqSwcERERERERUWmmdFHt7e0NDQ0NbNmyhY3KiIiIiIiI6KumdFF97do1XL16FTVr1iyJPERERERERESSofSa6gYNGiApKakkshARERERERFJitJXqkeOHInRo0dj/PjxcHZ2hoaGhsLxOnXqqCwcERERERERUWmmdFHdo0cPAMDAgQPlYzKZjI3KiIiIiIiI6KujdFEdFxdXEjmIiIiIiIiIJEfpojohIQFNmjRBuXKKT3379i3Cw8NhZWWlsnBEREREREREpZnSjcpatGiB58+fFxh/+fIlWrRooZJQRERERERERFKgdFH9fu30vz179gx6enoqCUVEREREREQkBUWe/t25c2cA75qS9e/fH1paWvJjeXl5iI6ORpMmTVSfkIiIiIiIiKiUKnJRbWhoCODdlWp9fX3o6OjIj2lqaqJRo0YYMmSI6hMSERERERERlVJFLqrXr18PALC2toafnx+nehMREREREdFXT+nu3zNmzCiJHERERERERESSU6Si2tXVFWFhYTA2NoaLi0uhjcrei4iIUFk4IiIiIiIiotKsSEV1p06d5I3JvLy8SjIPERERERERkWQUqaj+55RvTv8mIiIiIiIiekfpNdX/lJGRgfz8fIUxAwODzwpEREREREREJBVqyj4hLi4OHh4e0NPTg6GhIYyNjWFsbAwjIyMYGxuXREYiIiIiIiKiUknpK9V9+vSBIAhYt24dTE1NP9q0rKhWrFiBX375BcnJyahbty6WLVuGhg0bFvrY4OBgDBgwQGFMS0sL2dnZn52DiIiIiIiISBlKF9VRUVG4cuUKatasqZIA27dvh6+vL1auXIlvv/0WQUFBaNeuHW7fvg0TE5NCn2Ng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",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "result = user_proxy.initiate_chat(\n",
    "    recipient=pdf_processor,\n",
    "    summary_method=\"reflection_with_llm\",\n",
    "    message=f\"What data can you extract from the pdf under path {PDF_FILE_PATH} with the given schema {SCHEMA}\"\n",
    ")\n",
    "\n",
    "user_proxy.initiate_chat(\n",
    "    recipient=code_executor,\n",
    "    summary_method=\"reflection_with_llm\",\n",
    "    message=f\"\"\"Write Python code to plot a chart of the firm and their commitments based on {result.chat_history[-2]['content']}.\n",
    "            Save the chart to plot.png\"\"\"\n",
    ")   "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
